/*----------------------------------------------------------------------------*\
|
|						Public Interface to Muse Technology
|
|							     www.Muse.com
| Author : SunJun 
| Email : sundoom@msn.com
\*----------------------------------------------------------------------------*/

//////////////////////////////////////////////////////////////////////////
// $Id: Mesh.h,v 1.1 2009/04/03 12:46:10 sunjun Exp $
//////////////////////////////////////////////////////////////////////////

#ifndef __Mesh__
#define __Mesh__

//////////////////////////////////////////////////////////////////////////

#if defined __cplusplus

//////////////////////////////////////////////////////////////////////////

#include <MReference.h>

//////////////////////////////////////////////////////////////////////////

NAMESPACE_BEGIN

//////////////////////////////////////////////////////////////////////////

	typedef MPtr<class Mesh>MeshPtr;

	//////////////////////////////////////////////////////////////////////////

	// this class provides an object-oriented mesh interface.
	class API Mesh : public MReference
	{
	public:
		// constructor
		Mesh();

		// destructor
		virtual ~Mesh();

		// bind the mesh to the graph
		INLINE VOID bind( const class Context * rc );

		// load the data from the data
		INLINE VOID load( const MData* data );

		// draw the mesh
		INLINE VOID draw( const View* view );

	private:
		#pragma pack(push,1)
		struct Bone
		{
			Matrix base;
			Matrix pose;
			Matrix* source;
		};

		struct Batch
		{
			Vector3 min, max;
			ConstantPtr bone;
			std::vector<Matrix*>bones;
			PrimitivePtr primitive;
		};
		#pragma pack(pop)

	private:
		ContextPtr mRCPtr;
		std::map<Str, Bone>mBones;
		std::vector<Batch>mBatches;
		std::vector<Dict::KeyPtr>mKeys;
	};

//////////////////////////////////////////////////////////////////////////

NAMESPACE_END

//////////////////////////////////////////////////////////////////////////

#endif // __cplusplus

//////////////////////////////////////////////////////////////////////////

#endif // __GMesh__

//////////////////////////////////////////////////////////////////////////